//
//  MixingViewController.h
//  CocoaSynth
//
//  Created by Thomas Dupont on 18/02/10.
//  Copyright 2010 Apple Inc. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@protocol FactoryProtocol;
@protocol SequencerProtocol;

@class ModuleViewController;
@class ConnectorLayoutViewController;
@class MixingView;
@class PortInViewController;
@class PortOutViewController;
@class PortViewController;
@class ParametersViewController;
@class KeyboardViewController;

/*!
 @class			MixingViewController 
 @abstract		Le controleur de la table de mixage.
 @discussion	Controleur central de la partie IHM.
 */
@interface MixingViewController : NSViewController{
	MixingView* mixingView;
	NSMutableSet* modules;
	ConnectorLayoutViewController* connectors;
	NSInteger nbModules;
	ParametersViewController* parameters;
	ModuleViewController* highlightedModule;
	id<SequencerProtocol> sequencer;
	KeyboardViewController* keyboard;
}

/*!
 @abstract		Le controleur de la vue de param&eacute;trage.
 @discussion	Controleur de la vue &agrave; laquelle on va ajouter la vue de param&egrave;tres du module selectionn&eacute;.
 @param			aParameters Le controleur de la vue de param&eacute;trage.
 */
@property (retain) ParametersViewController* parameters;

/*!
 @abstract		Le sequencer de l'application.
 @discussion	Sequencer auquel on va ajouter les modules cr&eacute;&eacute;s par le drop d'un module sur la table de mixage.
 @param			aSequencer le sequencer de l'application.
 */
@property (assign) id<SequencerProtocol> sequencer;

/*!
 @abstract		Le controleur du clavier.
 @discussion	Controleur auquel on va affecter le module de keyboard d&egrave;s qu'il sera cr&eacute;&eacute;.
 @param			aKeyboard Le controleur du clavier.
 */
@property (retain) KeyboardViewController* keyboard;

/*!
 @method		addModule:
 @abstract		M&eacute;thode permettant d'ajouter un module.
 @discussion	Ajoute le module &agrave; la table de mixage et au s&eacute;quenceur.
 @param			aModule le module &agrave; ajouter.
 */
- (void)addModule:(ModuleViewController*)aModule;

/*!
 @method		removeModule:
 @abstract		M&eacute;thode permettant de supprimer un module.
 @discussion	Supprime les connexions des ports du module, puis supprime le module du s&eacute;quenceur et de la table de mixage.
 @param			aModule le module &agrave; supprimer.
 */
- (void)removeModule:(ModuleViewController*)aModule;

/*!
 @method		selectPortIn:
 @abstract		S&eacute;lectionne le port in pass&eacute; en param&egrave;tre.
 @param			aPort Le port &agrave; selectionner.
 */
- (void)selectPortIn:(PortInViewController*)aPort;

/*!
 @method		selectPortOut:
 @abstract		S&eacute;lectionne le port out pass&eacute; en param&egrave;tre.
 @param			aPort Le port &agrave; selectionner.
 */
- (void)selectPortOut:(PortOutViewController*)aPort;

/*!
 @method		unselectPorts
 @abstract		D&eacute;selectionne tous les ports.
 */
- (void)unselectPorts;

/*!
 @method		disconnectPort:
 @abstract		D&eacute;connecte le port pass&eacute; en param&egrave;tre.
 @param			aPort Le port &agrave; d&eacute;connecter.
 */
- (void)disconnectPort:(PortViewController*)aPort;

/*!
 @method		refresh
 @abstract		Rafraichit la vue des connecteurs.
 @discussion	M&eacute;thode utilis&eacute;e lors du d&eacute;placement d'un module pour faire suivre les connecteurs.
 */
- (void)refresh;

/*!
 @method		removeParameterView
 @abstract		Supprime la vue de param&eacute;trage actuelle.
 */
- (void)removeParameterView;

/*!
 @method		displayParameterView:
 @abstract		Affiche la vue de param&eacute;trage du module pass&eacute; en param&egrave;tre.
 @param			aModule Le module duquel on veut afficher la vue de param&eacute;trage.
 */
- (void)displayParameterView:(ModuleViewController*)aModule;

/*!
 @method		bringSubviewToFront:
 @abstract		Remonte la vue pass&eacute;e en param&egrave;tre au premier plan de la vue de la table de mixage.
 @param			aSubview La vue &agrave; remonter au premier plan.
 */
- (void)bringSubviewToFront:(NSView *)subview;

@end
